package com.rm.zeyou.util.token;

/**
 * token 工具类
 * @author ZhangKeChen
 * @date 2022/8/11
 */

import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class TokenUtil {

    //TODO 密钥自定义
    public static final String SECRET = "xishidaojia";
    //过期时间:秒
    public static final int EXPIRE = 24;
    /**
     * 生成Token
     */
    public static String getToken(String userId){
        return JWT.create().withAudience(userId) // 将 user id 保存到 token 里面 作为载荷
                .withExpiresAt(DateUtil.offsetHour(new Date(),EXPIRE*7)) //两小时后token过期
                .sign(Algorithm.HMAC256(SECRET)); // 以 sign 作为 token 的密钥

    }
    /**
     * 验证token
     */
    public static DecodedJWT verify(String token) {
        //如果有任何验证异常，此处都会抛出异常
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
        return decodedJWT;
    }

    /**
     * 获取token中的 payload
     */
    public static DecodedJWT getTokenInfo(String token) {
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
//     使用 TokenUtils.getTokenInfo(token).getClaim("account").asString()
        return decodedJWT;
    }

    /**
     * 获取token中的 userId
     */
    public static Integer getUserId(String token) {
        return Integer.parseInt(JWT.decode(token).getAudience().get(0));
    }
}
